package com.carrental.crm.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.carrental.crm.dto.UserCouponDTO;
import com.carrental.crm.entity.UserCoupon;
import com.carrental.crm.vo.UserCouponVO;

import java.util.List;

/**
 * 用户优惠券服务接口
 */
public interface UserCouponService extends IService<UserCoupon> {

    /**
     * 发放优惠券给用户
     *
     * @param userCouponDTO 用户优惠券DTO
     * @return 用户优惠券ID
     */
    Long issueCouponToUser(UserCouponDTO userCouponDTO);

    /**
     * 批量发放优惠券给用户
     *
     * @param couponId 优惠券ID
     * @param userIds  用户ID列表
     * @return 是否成功
     */
    boolean batchIssueCoupon(Long couponId, List<Long> userIds);

    /**
     * 根据ID获取用户优惠券详情
     *
     * @param id 用户优惠券ID
     * @return 用户优惠券VO
     */
    UserCouponVO getUserCouponById(Long id);

    /**
     * 根据优惠券码获取用户优惠券详情
     *
     * @param couponCode 优惠券码
     * @return 用户优惠券VO
     */
    UserCouponVO getUserCouponByCode(String couponCode);

    /**
     * 分页查询用户优惠券列表
     *
     * @param userId 用户ID
     * @param status 优惠券状态
     * @param page   分页参数
     * @return 用户优惠券VO分页
     */
    Page<UserCouponVO> pageUserCoupons(Long userId, Integer status, Page<UserCoupon> page);

    /**
     * 分页查询所有用户优惠券列表
     *
     * @param page       分页参数
     * @param userId     用户ID
     * @param couponId   优惠券ID
     * @param couponCode 优惠券码
     * @param status     优惠券状态
     * @param startTime  开始时间
     * @param endTime    结束时间
     * @return 用户优惠券VO分页
     */
    Page<UserCouponVO> pageAllUserCoupons(Page<UserCoupon> page, Long userId, Long couponId, String couponCode, Integer status, String startTime, String endTime);

    /**
     * 使用优惠券
     *
     * @param id      用户优惠券ID
     * @param orderId 订单ID
     * @param orderNo 订单号
     * @return 是否成功
     */
    boolean useCoupon(Long id, Long orderId, String orderNo);

    /**
     * 取消使用优惠券
     *
     * @param id 用户优惠券ID
     * @return 是否成功
     */
    boolean cancelUseCoupon(Long id);

    /**
     * 检查优惠券是否可用
     *
     * @param id        用户优惠券ID
     * @param vehicleId 车辆ID
     * @param storeId   门店ID
     * @param amount    订单金额
     * @return 是否可用
     */
    boolean checkCouponAvailable(Long id, Long vehicleId, Long storeId, Double amount);

    /**
     * 获取用户可用优惠券列表
     *
     * @param userId    用户ID
     * @param vehicleId 车辆ID
     * @param storeId   门店ID
     * @param amount    订单金额
     * @return 用户优惠券VO列表
     */
    List<UserCouponVO> getUserAvailableCoupons(Long userId, Long vehicleId, Long storeId, Double amount);
} 